package Toolkit;

public class TestCase {
    public final void Organization_Single_API() throws Exception {
        /*
         * 说明：
         * 1. 阅读本代码之前需要了解ccbpm的组织结构表结构设计. https://gitee.com/opencc/JFlow/wikis/pages/preview?sort_id=3557782&doc_id=31094
         * 2. 该组织结构系列api就是通过接口的模式对这些表进行增加、删除、修改.
         * 3. 您也可以使用自己的方法，直接对表进行操作.
         */

        //登陆:获得token. 只有管理员这个账号才能执行组织结构同步.
        Dev2InterfaceRestfulAPI.Port_Login("admin", "");


        ///#region 1. 对角色类型的操作.
        /*
         * 说明：
         * 1. 角色类型是对表： Port_StationType 的操作.
         * 2. 角色类型用于对角色的分组，没有计算意义,对于角色表来说它是外键，如果您的系统没有这个表，就插入一笔编号：001, 名称：通用角色 的记录。
         */

        // 保存或者新增角色, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_StationType_Save("", "001", "通用角色", "");

        //删除角色.
        Dev2InterfaceRestfulAPI.Port_StationType_Delete("", "001");

        ///#endregion 1. 对角色类型的操作.


        ///#region 2. 对角色的操作.
        /*
         * 说明：
         * 1. 角色是对表 Port_Station 的操作.
         */

        // 保存或者新增角色, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_StationType_Save("", "001", "财务经理岗", "");

        //删除角色.
        Dev2InterfaceRestfulAPI.Port_StationType_Delete("", "001");

        ///#endregion 2. 对角色的操作.


        ///#region 3. 对部门的操作.
        /*
         * 说明：
         * 1. 部门是对 Port_Dept 的操作.
         */
        // 保存或者新增, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_Dept_Save("", "001", "总经理办公室", Config.DeptDefaultNo, "");

        //删除.
        Dev2InterfaceRestfulAPI.Port_Dept_Delete("001");

        ///#endregion 3. 对部门的操作.


        ///#region 4. 对人员的操作.
        /* 增加或者保存人员,对应的表:Port_Emp.
         * 1. 如果有此zhangsan的账号就更新，没有就插入，详细的参数请参考结构说明.
         * 2. OrgNo 是组织编号,对单组织为空.
         * 3. 如果一人多部门就可以调用多次,stationNos 是当前人员在该部门下的角色.
         */
        String userNo = "zhangsan", userName = "张三";
        String deptNo = "1001"; // 部门编号.
        String keyValues = "@Tel=xxxx@Leader=lisi@Email=zhangsan##ccflow.org"; // 字段值..
        String stationNos = "001,003,003"; // 更新的岗位编号，这些岗位的信息更新到 deptNo 部门下.
        String adminToken = WebUser.Token;
        Dev2InterfaceRestfulAPI.Port_Emp_Save("", userNo, userName, deptNo, keyValues, stationNos);

        //删除兼职部门,以及他在该部门下的岗位集合.
        Dev2InterfaceRestfulAPI.Port_Emp_DeleteOneDept("", userNo, deptNo);

        //删除账号
        Dev2InterfaceRestfulAPI.Port_Emp_Delete(userNo);

        ///#endregion 4. 对人员的操作.
    }
    /**
     集团组织:组织结构数据数据同步API.
     */
    public final void Organization_Group_API() throws Exception {
        /*
         * 说明：
         * 1. 阅读本代码之前需要了解ccbpm的组织结构表结构设计. https://gitee.com/opencc/JFlow/wikis/pages/preview?sort_id=3557782&doc_id=31094
         * 2. 该组织结构系列api就是通过接口的模式对这些表进行增加、删除、修改.
         * 3. 您也可以使用自己的方法，直接对表进行操作.
         * 4. 参考单组织版.
         */
        //登陆:获得token. 只有管理员这个账号才能执行组织结构同步.
        Dev2InterfaceRestfulAPI.Port_Login("admin", "123");
        String adminToken = WebUser.Token;

        ///#region 1. 对角色类型的操作.
        /*
         * 说明：
         * 1. 角色类型是对表： Port_StationType 的操作.
         * 2. 角色类型用于对角色的分组，没有计算意义,对于角色表来说它是外键，如果您的系统没有这个表，就插入一笔编号：001, 名称：通用角色 的记录。
         */

        // 保存或者新增角色, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_StationType_Save(Config.DeptDefaultNo, "001", "通用角色", "");
        //删除角色.
        Dev2InterfaceRestfulAPI.Port_StationType_Delete(Config.DeptDefaultNo, "001");

        ///#endregion 1. 对角色类型的操作.


        ///#region 2. 对角色的操作.
        /*
         * 说明：
         * 1. 角色是对表 Port_Station 的操作.
         */
        // 保存或者新增角色, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_StationType_Save(Config.DeptDefaultNo, "001", "财务经理岗", "");

        //删除角色.
        Dev2InterfaceRestfulAPI.Port_StationType_Delete(Config.DeptDefaultNo, "001");

        ///#endregion 2. 对角色的操作.


        ///#region 3. 对部门的操作.
        /*
         * 说明：
         * 1. 部门是对 Port_Dept 的操作.
         */
        // 保存或者新增, 有编号=001的数据就更新，没有就增加。
        Dev2InterfaceRestfulAPI.Port_Dept_Save(Config.DeptDefaultNo, "001", "总经理办公室", Config.DeptDefaultNo, "");

        //删除.
        Dev2InterfaceRestfulAPI.Port_Dept_Delete("001");

        ///#endregion 3. 对部门的操作.


        ///#region 4. 对人员的操作.
        /* 增加或者保存人员,对应的表:Port_Emp.
         * 1. 如果有此zhangsan的账号就更新，没有就插入，详细的参数请参考结构说明.
         * 2. OrgNo 是组织编号,对单组织为空.
         * 3. 如果一人多部门就可以调用多次,stationNos 是当前人员在该部门下的角色.
         */
        String userNo = "zhangsan", userName = "张三";
        String deptNo = "1001"; // 部门编号.
        String keyValues = "@Tel=xxxx@Leader=lisi@Email=zhangsan##ccflow.org"; // 字段值..
        String stationNos = "001,003,003"; // 更新的岗位编号，这些岗位的信息更新到 deptNo 部门下.
        Dev2InterfaceRestfulAPI.Port_Emp_Save(Config.DeptDefaultNo, userNo, userName, deptNo, keyValues, stationNos);

        //删除兼职部门,以及他在该部门下的岗位集合.
        Dev2InterfaceRestfulAPI.Port_Emp_DeleteOneDept(Config.DeptDefaultNo, userNo, deptNo);

        //删除账号
        Dev2InterfaceRestfulAPI.Port_Emp_Delete(userNo);

        ///#endregion 4. 对人员的操作.

    }
    /**
     菜单api: 获得发起、待办、在途、抄送等菜单
     */
    public final void Demo0_MenuDBApi() throws Exception {
        /*
         * 说明：
         * 1. 通过api获得json数据集合，并构建自己的发起、待办、...页面。
         */
        //登陆:获得用户token.
        Dev2InterfaceRestfulAPI.Port_Login("liping", "123");

        //获得发起列表.
        String jsonStart = Dev2InterfaceRestfulAPI.DB_Start("").dataOfString;

        //获得待办.
        String jsonTodolist = Dev2InterfaceRestfulAPI.DB_Start("").dataOfString;

        //获得待办(待阅/已阅).
        String jsonTodolistByIsRead = Dev2InterfaceRestfulAPI.DB_TodolistByIsRead("0", "").dataOfString;

        //获得在途
        String jsonRuning = Dev2InterfaceRestfulAPI.DB_Runing("").dataOfString;

        //草稿:暂存的表单,请参考流程属性草稿规则
        String draftCCList = Dev2InterfaceRestfulAPI.DB_Draft("").dataOfString;

        //根据已读未读参数获取抄送列表数据
        String CCListByIsRead = Dev2InterfaceRestfulAPI.DB_CCListByIsRead("0").dataOfString;

        String jsonCCList = Dev2InterfaceRestfulAPI.DB_CCList("", "001").message;
    }
    /**
     创建一个简单的流程实例: 发起、发送、撤销、催办、抄送、移交、退回等基础操作.
     */
    public final void Demo1_StartSimpleWorkFlow() throws Exception {
        /*
         * 说明：
         * 1. 首先在流程设计器里定义一个流程模板.
         * 2. 记录下来流程编号，每个节点的ID.
         */

        ///#region 1.开始节点发起.
        //登陆:获得用户token.
        Dev2InterfaceRestfulAPI.Port_Login("admin", "123");

        String token = WebUser.Token;

        //生成一个流程实例：WorkID，它是一个长整型的数据。 如果liping不能执行发起此流程系统就抛出错误。018
        long workID = Dev2InterfaceRestfulAPI.Node_CreateBlankWorkID("082");

        //如果需要用到了草稿功能：就执行设置草稿。
        Dev2InterfaceRestfulAPI.Node_SetDraft(workID);

        //如果需要向流程引擎写入参数,就执行写入参数,比如：按照参数控制方向条件、或者接受人。
        String paras = "@JinE=1020@JSR=zhangsna";
        Dev2InterfaceRestfulAPI.Flow_SaveParas(workID, paras);

        //**提交表单时同时做以下两步
        //如果当前流程使用的是节点表单,需要向开始节点表单写入数据. etc: 向从表、附件写入数据参考下一个demo.
        String keyVals = "@Tel=18660153393@Addr=山东济南@Age=18@JE=111.111";
        //Dev2InterfaceRestfulAPI.Node_SaveWork( workID, keyVals);

        Dev2InterfaceRestfulAPI.Node_SaveWorkByMap(workID, keyVals,null,null);

        //如果想打开工作处理器:
        String url = "https://wwww.workflow.com/Port.vue?DoWhat=MyWork&WorkID=" + workID + "&Token=" + token;


        //执行发送1: 系统就按照设计器定义的接受人规则与方向流转,返回执行结果,提示给操作员.
        String msgSend = Dev2InterfaceRestfulAPI.Node_SendWork(workID, "0", "","","").message;
        //**提交表单时同时做以上两步

        //如需需要撤销.
        String msgUnSend = Dev2InterfaceRestfulAPI.Flow_DoUnSend(String.valueOf(workID));


        //执行抄送，需要的情景下执行完发送执行 ,抄送标题可以为空，空时默认流程标题
        String msgCCSend = Dev2InterfaceRestfulAPI.Node_CC_WriteTo_CClist(602, (int) workID, "zhanghaicheng", "张海成", "关于XXX的请示", "请悉知").message;

        //执行发送2: 发送或者跳转到执行的节点，返回执行结果,提示给操作员.
        //msgSend = Dev2InterfaceRestfulAPI.Node_SendWork( workID, "603", "lisi,wangwu");

        //如果需要催办.
        String msgPress = Dev2InterfaceRestfulAPI.Flow_DoPress(String.valueOf(workID), "请于7日前办理").message;

        //如果需要设置标题.
        String msgSetTitle = Dev2InterfaceRestfulAPI.Flow_SetTitle((int) workID, "关于2024年3月报销流程通知").message;


        ///#endregion 2.开始节点发起.


        ///#region 2. 第2个节点执行.
        //切换账号.
        Dev2InterfaceRestfulAPI.Port_Login("yuwen", "123");


        keyVals = "@Tel=18660153393";
        Dev2InterfaceRestfulAPI.Node_SaveWork((int) workID, keyVals,"","");

        //可以执行继续发送,执行发送.
        msgSend = Dev2InterfaceRestfulAPI.Node_SendWork(workID, "0", "","","").message;

        keyVals = "@Addr=山东济南";
        Dev2InterfaceRestfulAPI.Node_SaveWork((int)workID, keyVals,"","");

        //再次发送
        msgSend = Dev2InterfaceRestfulAPI.Node_SendWork(workID, "0", "","","").message;

        ///#endregion 2. 第2个节点执行.


        ///#region 3. 第3个节点执行.
        //切换账号.
        Dev2InterfaceRestfulAPI.Port_Login("fuhui", "123");

        //如果需要退回：执行退回, 返回执行结果.，第三个参数节点ID可以为空，为空时自动计算可以退回的节点ID执行退回操作
        String msgReturn = Dev2InterfaceRestfulAPI.Node_ReturnWork((int) workID, 602, "", "工作有误需要退回", true);

        ///#endregion 3. 第3个节点执行.

        //如果需要移交.
        String msgShift = Dev2InterfaceRestfulAPI.Node_Shift((int) workID, "zhangyifan", "需要您处理一下").message;

        //如果需要增加处理人.
        String msgAddTodo = Dev2InterfaceRestfulAPI.Node_AddTodolist((int) workID, "zhanghaicheng").message;

        //如果需要结束流程.101,102,103,stopFlowType:结束类型,写入到WF_GenerWorkFlow,AtPara字段 1=正常结束,0=非正常结束
        String msgFlowOver = Dev2InterfaceRestfulAPI.Flow_DoFlowOver(String.valueOf(workID), 0).message;

        //如果需要删除流程.
        String msgFlowDel = Dev2InterfaceRestfulAPI.Batch_Delete(String.valueOf(workID));
    }
    /**
     创建一个简单的流程实例: 为开始节点表单保存数据.
     主表数据、从表数据、附件数据
     */
    public final void Demo2_StartSimpleAddFormData() throws Exception {
        /*
         * 说明：
         * 1. 首先在流程设计器里定义一个流程模板.
         * 2. 记录下来流程编号，每个节点的ID.
         * 3. 在开始节点上，设置一个表单、包含主表、从表、附件元素.记录下来从表的标识、附件的标识.
         * 4. 设置附件属性为url模式.
         */

        //登陆:获得用户token.
        Dev2InterfaceRestfulAPI.Port_Login("fuhui", "123");

        String token = WebUser.Token;

        //生成一个流程实例：WorkID，它是一个长整型的数据。 如果liping不能执行发起此流程系统就抛出错误。
        long workID = Dev2InterfaceRestfulAPI.Node_CreateBlankWorkID("006");

        //保存主表数据.
        String keyVals = "@Tel=18660153393@Addr=山东济南";
        //从表数据:支持多个从表.通过json的标记与从表的ID对应,标识数据存储到那个从表组件里.
        String dtlJSON = "{'ND601CheLiangXinXi':[{'ChePaiHao':'黑A888C','CheLiangLeiXing':'轿车'}],'ND601RenYuanXinXi':[{'XingMing':'张三','JiGuan':'山东','XueLi':'本科'},{'XingMing':'李四','JiGuan':'北京','XueLi':'硕士'}]}";
        // 附件数据:支持多个附件,通过json的标记与附件的ID对应,标识数据存储到那个附件组件里.
        String athJSON = "{'FuJian1':[{'FileName':'wx01.png','FileUrl':'http://ccflow.org/image/wx01.png'},{'FileName':'wx02.png','FileUrl':'http://ccflow.org/image/wx02.png'}],'FuJian2':[{'FileName':'ccbpm.css','FileUrl':'http://localhost:2296/DataUser/InstancePacketOfData/Template/ccbpm.css'}]}";
        //执行数据保存.
        Dev2InterfaceRestfulAPI.Node_SaveWork((int) workID, keyVals, dtlJSON, athJSON);

        //打开页面.
        String url = "https://wwww.workflow.com/Port.vue?DoWhat=MyWork&WorkID=" + workID + "&Token=" + token;

    }
    /**
     启动一个流程，设置父子流程关系.
     */
    public final void Demo3_StartSimpleSetParentFlow() throws Exception {
        /*
         * 说明：
         * 1. 首先在流程设计器里定义一个流程模板.
         */

        //登陆:获得用户token.
        Dev2InterfaceRestfulAPI.Port_Login("liping", "123");
        String token = WebUser.Token;

        //生成一个流程实例：WorkID，它是一个长整型的数据。 如果liping不能执行发起此流程系统就抛出错误。
        long workID = Dev2InterfaceRestfulAPI.Node_CreateBlankWorkID("001");

        String parentNo = "002";
        long parentWorkID = 1000;

        //设置流程的父子关系.
        Dev2InterfaceRestfulAPI.Flow_SetParentInfo("001", workID, parentWorkID, false);
    }

    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
    public static void PrintInfo(ReturnObj obj)
    {
        System.out.println("  编码[" + obj.code + "]消息:" + obj.message);
        System.out.println("  数据:" + obj.dataOfString);

    }

}